Actionsを使ってアプリケーション毎やコネクション毎でMFAを行うか行わないか判断してみる [Auth0 Actions]
Auth0ではActionsという機能を使うことによって認証フローのカスタマイズを行うことが可能です。
nodejsでコードを書くことによってAuth0のログインイベントの情報を扱うことができます。
今回はこれを使ってMFAを実行するかしないかを判定したいと思います。
以下のユースケースを想定しました。
- 開発環境で動かすアプリはMFAはスキップしたい
- 特定のアプリの場合、ログイン方法によってはMFAはスキップしたい
- 例えば、googleログイン時はMFAをスキップ、パスワードを使ってログインするときはMFAを行う
カスタマイズ時におけるAuth0でのMFAの設定
Multi-factor Authentication
の画面のDefine policies
という設定項目の中に、ユーザーが追加の認証要素を使用して認証できるようになるタイミングを定義する箇所があります。
Require Multi-factor Auth
という項目を Never
にする必要があります。
Always
やUse Adaptive MFA
だとAuth0によってMFAのフローが行われますが、Never
だとユーザーはログインするために追加のファクターを使用する必要がなくなります。
これでActionsを使って制御できるようになります。
Actionsをかく
かなり昔に書いたブログに載せていましたが、Loginフローに追加します。
※ 組み込みに関しては上記記事を参照していただければと。
MFAを実行するコードは以下にしています。
※ onExecutePostLogin
内で api.multifactor.enable()
を実行
exports.onExecutePostLogin = async (event, api) => { // provider // any: Use any of the configured challenges. // duo: Use the Duo mutlifactor provider. // google-authenticator: Use the Google Authenticator provider. // guardian: Use the Guardian provider. api.multifactor.enable("any", {"allowRememberBrowser": false}); };
開発環境で動かすアプリはMFAはスキップしたい といった場合は、Auth0のアプリケーションに紐づくclient_id
で判定しました。
例)
// 特定いのアプリケーションはMFAをスキップする if(event.client.client_id === "tr8xyo8WdlyZZvWFZpBrXilDpfatGxc8") { return; }
特定のアプリの場合、ログイン方法によってはMFAはスキップしたい といった場合は
client_id
とconnection.name
で判定できます。
例) アプリAかつgoogle認証の場合はスキップする
// 特定のアプリケーションかつ特定のコネクションでログインされた時はMFAをスキップする if(event.client.client_id === "XZiyC6UATH9Mr5tlHOxwJNp1VEdfTuBd" && event.connection.name === "google-oauth2") { return; }
event.connection.name
とスキップする条件のコネクション名で判定します。
event.connection.id
でも判定は可能なので、好きな方を使いましょう。
今回試したような単純なユースケースだと比較的簡単に判定できました(アプリケーションのclient.idとログインに使用されたconnection.nameだけ)。
ユーザー、アプリケーション、コネクションなど、さまざまな条件でMFAのカスタマイズを行えるは便利でした。 会社の従業員の場合はMFA不要、協力会社の従業員はMFA必要といった仕様の場合に遭遇した時に使えそうなので覚えておこうと思います